Enter the directory of the maca folder on your drive and the name of the tissue you want to analyze.

tissue_of_interest = "Marrow"
Warning message:
package ‘Seurat’ was built under R version 3.4.3 
library(here)
here() starts at /Users/olgabot/Documents/GitHub/tabula-muris
source(here("00_data_ingest", "02_tissue_analysis_rmd", "boilerplate.R"))
package ‘dplyr’ was built under R version 3.4.2
Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

package ‘tidyverse’ was built under R version 3.4.2── Attaching packages ──────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ tibble  1.3.4     ✔ purrr   0.2.4
✔ tidyr   0.7.2     ✔ stringr 1.2.0
✔ readr   1.1.1     ✔ forcats 0.2.0
package ‘tidyr’ was built under R version 3.4.2package ‘purrr’ was built under R version 3.4.2── Conflicts ─────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ tidyr::expand()   masks Matrix::expand()
✖ dplyr::filter()   masks stats::filter()
✖ cowplot::ggsave() masks ggplot2::ggsave()
✖ dplyr::lag()      masks stats::lag()
tiss = load_tissue_droplet(tissue_of_interest)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data matrix"

  |                                                                                     
  |                                                                               |   0%
  |                                                                                     
  |===                                                                            |   4%
  |                                                                                     
  |=======                                                                        |   8%
  |                                                                                     
  |==========                                                                     |  12%
  |                                                                                     
  |=============                                                                  |  17%
  |                                                                                     
  |================                                                               |  21%
  |                                                                                     
  |====================                                                           |  25%
  |                                                                                     
  |=======================                                                        |  29%
  |                                                                                     
  |==========================                                                     |  33%
  |                                                                                     
  |==============================                                                 |  38%
  |                                                                                     
  |=================================                                              |  42%
  |                                                                                     
  |====================================                                           |  46%
  |                                                                                     
  |========================================                                       |  50%
  |                                                                                     
  |===========================================                                    |  54%
  |                                                                                     
  |==============================================                                 |  58%
  |                                                                                     
  |=================================================                              |  62%
  |                                                                                     
  |=====================================================                          |  67%
  |                                                                                     
  |========================================================                       |  71%
  |                                                                                     
  |===========================================================                    |  75%
  |                                                                                     
  |===============================================================                |  79%
  |                                                                                     
  |==================================================================             |  83%
  |                                                                                     
  |=====================================================================          |  88%
  |                                                                                     
  |========================================================================       |  92%
  |                                                                                     
  |============================================================================   |  96%
  |                                                                                     
  |===============================================================================| 100%
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

Visualize top genes in principal components

Later on (in FindClusters and TSNE) you will pick a number of principal components to use. This has the effect of keeping the major directions of variation in the data and, ideally, supressing noise. There is no correct answer to the number to use, but a decent rule of thumb is to go until the plot plateaus.

PCElbowPlot(object = tiss)

Choose the number of principal components to use.

# Set number of principal components. 
n.pcs = 10

The clustering is performed based on a nearest neighbors graph. Cells that have similar expression will be joined together. The Louvain algorithm looks for groups of cells with high modularity–more connections within the group than between groups. The resolution parameter determines the scale…higher resolution will give more clusters, lower resolution will give fewer.

For the top-level clustering, aim to under-cluster instead of over-cluster. It will be easy to subset groups and further analyze them below.

# Set resolution 
res.used <- 0.5
tiss <- FindClusters(object = tiss, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE)

To visualize

# If cells are too spread out, you can raise the perplexity. If you have few cells, try a lower perplexity (but never less than 10).
tiss <- RunTSNE(object = tiss, dims.use = 1:n.pcs, seed.use = 10, perplexity=100, dim.embed = 2)
# note that you can set do.label=T to help label individual clusters
TSNEPlot(object = tiss, do.label = T)

Compare to previous annotations

filename = here('00_data_ingest', '03_tissue_annotation_csv', 
                     paste0(tissue_of_interest, "_droplet_annotation.csv"))
previous_annotation = read_csv(filename)
Missing column names filled in: 'X1' [1]Parsed with column specification:
cols(
  X1 = col_character(),
  channel = col_character(),
  cell_ontology_class = col_character(),
  cell_ontology_id = col_character()
)
tiss@meta.data[, 'previous_annotation'] <- "NA"
tiss@meta.data[as.character(previous_annotation$X1), 'previous_annotation'] <- as.character(previous_annotation$cell_ontology_class)
TSNEPlot(object = tiss, do.return = TRUE, group.by = "previous_annotation")

table(tiss@meta.data[, "previous_annotation"])

                    basophil             early pro-B cell                 erythroblast 
                          61                           64                          155 
   Fraction A pre-pro B cell                  granulocyte      granulocytopoietic cell 
                          38                          732                          371 
hematopoietic precursor cell              immature B cell              late pro-B cell 
                         397                          118                          264 
                  macrophage                     monocyte              proerythroblast 
                         223                          528                          265 
                 promonocyte                       T cell 
                         274                          162 
table(tiss@meta.data[, "previous_annotation"], tiss@ident)
                              
                                 0   1   2   3   4   5   6   7   8   9  10  11  12  13
  basophil                       0   0   0   0   0   0   0   0   0   0   0   0   0  61
  early pro-B cell               0   0   0   0   0   0   0   0   0   0   0   0  64   0
  erythroblast                   0   0   1   0   0   0   0   0   0   0 154   0   0   0
  Fraction A pre-pro B cell      0   0  37   1   0   0   0   0   0   0   0   0   0   0
  granulocyte                    0 432   0   6   0 270   0   0   0   0   1  23   0   0
  granulocytopoietic cell        0   0   0 368   3   0   0   0   0   0   0   0   0   0
  hematopoietic precursor cell   0   0  70   2 324   0   1   0   0   0   0   0   0   0
  immature B cell                0   0   0   0   3   0   0   0   1   0   0 113   1   0
  late pro-B cell                0   0   0   0   0   0 264   0   0   0   0   0   0   0
  macrophage                     0   0   1   1   0   0   0   0 221   0   0   0   0   0
  monocyte                     524   0   3   0   0   0   0   0   1   0   0   0   0   0
  proerythroblast                0   0   0   0   0   0   0 265   0   0   0   0   0   0
  promonocyte                    1   0 273   0   0   0   0   0   0   0   0   0   0   0
  T cell                         0   0   0   0   0   0   0   0   0 162   0   0   0   0

Check expression of genes of interset. Found inconsistensies in gene names. Mme (Cd10), Ly6g6c, Ly6g6e, and Iga2b though present in plate data was not found here and gave an error.

Dotplots let you see the intensity of exppression and the fraction of cells expressing for each of your genes of interest.

How big are the clusters?

table(tiss@ident)

  0   1   2   3   4   5   6   7   8   9  10  11  12  13 
525 432 385 378 330 270 265 265 223 162 155 136  65  61 

Which markers identify a specific cluster?

clust.markers <- FindMarkers(object = tiss, ident.1 = 2, ident.2 = 1, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 48s      
   |++                                                | 2 % ~01m 55s      
   |++                                                | 3 % ~01m 35s      
   |+++                                               | 4 % ~01m 22s      
   |+++                                               | 5 % ~01m 15s      
   |++++                                              | 6 % ~01m 10s      
   |++++                                              | 7 % ~01m 07s      
   |+++++                                             | 8 % ~01m 05s      
   |+++++                                             | 9 % ~01m 03s      
   |++++++                                            | 10% ~01m 02s      
   |++++++                                            | 11% ~01m 00s      
   |+++++++                                           | 12% ~58s          
   |+++++++                                           | 13% ~57s          
   |++++++++                                          | 14% ~55s          
   |++++++++                                          | 15% ~54s          
   |+++++++++                                         | 16% ~53s          
   |+++++++++                                         | 18% ~52s          
   |++++++++++                                        | 19% ~51s          
   |++++++++++                                        | 20% ~50s          
   |+++++++++++                                       | 21% ~49s          
   |+++++++++++                                       | 22% ~48s          
   |++++++++++++                                      | 23% ~47s          
   |++++++++++++                                      | 24% ~46s          
   |+++++++++++++                                     | 25% ~45s          
   |+++++++++++++                                     | 26% ~45s          
   |++++++++++++++                                    | 27% ~44s          
   |++++++++++++++                                    | 28% ~43s          
   |+++++++++++++++                                   | 29% ~43s          
   |+++++++++++++++                                   | 30% ~42s          
   |++++++++++++++++                                  | 31% ~41s          
   |++++++++++++++++                                  | 32% ~40s          
   |+++++++++++++++++                                 | 33% ~40s          
   |++++++++++++++++++                                | 34% ~39s          
   |++++++++++++++++++                                | 35% ~38s          
   |+++++++++++++++++++                               | 36% ~37s          
   |+++++++++++++++++++                               | 37% ~36s          
   |++++++++++++++++++++                              | 38% ~36s          
   |++++++++++++++++++++                              | 39% ~35s          
   |+++++++++++++++++++++                             | 40% ~35s          
   |+++++++++++++++++++++                             | 41% ~34s          
   |++++++++++++++++++++++                            | 42% ~33s          
   |++++++++++++++++++++++                            | 43% ~33s          
   |+++++++++++++++++++++++                           | 44% ~32s          
   |+++++++++++++++++++++++                           | 45% ~31s          
   |++++++++++++++++++++++++                          | 46% ~30s          
   |++++++++++++++++++++++++                          | 47% ~30s          
   |+++++++++++++++++++++++++                         | 48% ~29s          
   |+++++++++++++++++++++++++                         | 49% ~29s          
   |++++++++++++++++++++++++++                        | 51% ~28s          
   |++++++++++++++++++++++++++                        | 52% ~27s          
   |+++++++++++++++++++++++++++                       | 53% ~27s          
   |+++++++++++++++++++++++++++                       | 54% ~26s          
   |++++++++++++++++++++++++++++                      | 55% ~25s          
   |++++++++++++++++++++++++++++                      | 56% ~25s          
   |+++++++++++++++++++++++++++++                     | 57% ~24s          
   |+++++++++++++++++++++++++++++                     | 58% ~23s          
   |++++++++++++++++++++++++++++++                    | 59% ~23s          
   |++++++++++++++++++++++++++++++                    | 60% ~22s          
   |+++++++++++++++++++++++++++++++                   | 61% ~22s          
   |+++++++++++++++++++++++++++++++                   | 62% ~21s          
   |++++++++++++++++++++++++++++++++                  | 63% ~21s          
   |++++++++++++++++++++++++++++++++                  | 64% ~20s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~19s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~19s          
   |++++++++++++++++++++++++++++++++++                | 67% ~18s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~18s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~17s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~17s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~16s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~15s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~15s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~14s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~14s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~13s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~13s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~12s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 55s
print(x = head(x= clust.markers, n = 10))

You can also compute all markers for all clusters at once. This may take some time.

tiss.markers <- FindAllMarkers(object = tiss, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 39s      
   |++                                                | 2 % ~01m 37s      
   |++                                                | 3 % ~01m 35s      
   |+++                                               | 4 % ~01m 34s      
   |+++                                               | 5 % ~01m 33s      
   |++++                                              | 6 % ~01m 32s      
   |++++                                              | 7 % ~01m 31s      
   |+++++                                             | 8 % ~01m 34s      
   |+++++                                             | 9 % ~01m 32s      
   |++++++                                            | 11% ~01m 31s      
   |++++++                                            | 12% ~01m 30s      
   |+++++++                                           | 13% ~01m 29s      
   |+++++++                                           | 14% ~01m 27s      
   |++++++++                                          | 15% ~01m 26s      
   |++++++++                                          | 16% ~01m 25s      
   |+++++++++                                         | 17% ~01m 25s      
   |+++++++++                                         | 18% ~01m 23s      
   |++++++++++                                        | 19% ~01m 22s      
   |++++++++++                                        | 20% ~01m 21s      
   |+++++++++++                                       | 21% ~01m 20s      
   |++++++++++++                                      | 22% ~01m 19s      
   |++++++++++++                                      | 23% ~01m 18s      
   |+++++++++++++                                     | 24% ~01m 17s      
   |+++++++++++++                                     | 25% ~01m 16s      
   |++++++++++++++                                    | 26% ~01m 15s      
   |++++++++++++++                                    | 27% ~01m 14s      
   |+++++++++++++++                                   | 28% ~01m 12s      
   |+++++++++++++++                                   | 29% ~01m 11s      
   |++++++++++++++++                                  | 31% ~01m 10s      
   |++++++++++++++++                                  | 32% ~01m 09s      
   |+++++++++++++++++                                 | 33% ~01m 08s      
   |+++++++++++++++++                                 | 34% ~01m 07s      
   |++++++++++++++++++                                | 35% ~01m 06s      
   |++++++++++++++++++                                | 36% ~01m 05s      
   |+++++++++++++++++++                               | 37% ~01m 04s      
   |+++++++++++++++++++                               | 38% ~01m 03s      
   |++++++++++++++++++++                              | 39% ~01m 02s      
   |++++++++++++++++++++                              | 40% ~01m 01s      
   |+++++++++++++++++++++                             | 41% ~60s          
   |++++++++++++++++++++++                            | 42% ~59s          
   |++++++++++++++++++++++                            | 43% ~58s          
   |+++++++++++++++++++++++                           | 44% ~57s          
   |+++++++++++++++++++++++                           | 45% ~56s          
   |++++++++++++++++++++++++                          | 46% ~55s          
   |++++++++++++++++++++++++                          | 47% ~54s          
   |+++++++++++++++++++++++++                         | 48% ~52s          
   |+++++++++++++++++++++++++                         | 49% ~51s          
   |++++++++++++++++++++++++++                        | 51% ~50s          
   |++++++++++++++++++++++++++                        | 52% ~49s          
   |+++++++++++++++++++++++++++                       | 53% ~48s          
   |+++++++++++++++++++++++++++                       | 54% ~47s          
   |++++++++++++++++++++++++++++                      | 55% ~46s          
   |++++++++++++++++++++++++++++                      | 56% ~45s          
   |+++++++++++++++++++++++++++++                     | 57% ~44s          
   |+++++++++++++++++++++++++++++                     | 58% ~43s          
   |++++++++++++++++++++++++++++++                    | 59% ~42s          
   |++++++++++++++++++++++++++++++                    | 60% ~41s          
   |+++++++++++++++++++++++++++++++                   | 61% ~39s          
   |++++++++++++++++++++++++++++++++                  | 62% ~38s          
   |++++++++++++++++++++++++++++++++                  | 63% ~37s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~36s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~35s          
   |++++++++++++++++++++++++++++++++++                | 66% ~34s          
   |++++++++++++++++++++++++++++++++++                | 67% ~33s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~32s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~31s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~30s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~29s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~28s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~27s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~26s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~25s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~23s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~22s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~21s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 41s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~03m 12s      
   |++                                                | 2 % ~03m 05s      
   |++                                                | 3 % ~03m 01s      
   |+++                                               | 4 % ~02m 59s      
   |+++                                               | 5 % ~02m 56s      
   |++++                                              | 6 % ~02m 54s      
   |++++                                              | 7 % ~02m 55s      
   |+++++                                             | 8 % ~02m 52s      
   |+++++                                             | 9 % ~02m 51s      
   |++++++                                            | 10% ~02m 48s      
   |++++++                                            | 11% ~02m 46s      
   |+++++++                                           | 12% ~02m 44s      
   |+++++++                                           | 13% ~02m 42s      
   |++++++++                                          | 14% ~02m 40s      
   |++++++++                                          | 15% ~02m 38s      
   |+++++++++                                         | 16% ~02m 36s      
   |+++++++++                                         | 17% ~02m 33s      
   |++++++++++                                        | 18% ~02m 31s      
   |++++++++++                                        | 19% ~02m 29s      
   |+++++++++++                                       | 20% ~02m 28s      
   |+++++++++++                                       | 21% ~02m 26s      
   |++++++++++++                                      | 22% ~02m 24s      
   |++++++++++++                                      | 23% ~02m 22s      
   |+++++++++++++                                     | 24% ~02m 20s      
   |+++++++++++++                                     | 25% ~02m 19s      
   |++++++++++++++                                    | 26% ~02m 17s      
   |++++++++++++++                                    | 27% ~02m 15s      
   |+++++++++++++++                                   | 28% ~02m 13s      
   |+++++++++++++++                                   | 29% ~02m 11s      
   |++++++++++++++++                                  | 30% ~02m 10s      
   |++++++++++++++++                                  | 31% ~02m 08s      
   |+++++++++++++++++                                 | 32% ~02m 06s      
   |+++++++++++++++++                                 | 33% ~02m 04s      
   |++++++++++++++++++                                | 34% ~02m 03s      
   |++++++++++++++++++                                | 35% ~02m 01s      
   |+++++++++++++++++++                               | 36% ~01m 59s      
   |+++++++++++++++++++                               | 37% ~01m 57s      
   |++++++++++++++++++++                              | 38% ~01m 55s      
   |++++++++++++++++++++                              | 39% ~01m 53s      
   |+++++++++++++++++++++                             | 40% ~01m 52s      
   |+++++++++++++++++++++                             | 41% ~01m 50s      
   |++++++++++++++++++++++                            | 42% ~01m 48s      
   |++++++++++++++++++++++                            | 43% ~01m 46s      
   |+++++++++++++++++++++++                           | 44% ~01m 44s      
   |+++++++++++++++++++++++                           | 45% ~01m 42s      
   |++++++++++++++++++++++++                          | 46% ~01m 40s      
   |++++++++++++++++++++++++                          | 47% ~01m 38s      
   |+++++++++++++++++++++++++                         | 48% ~01m 36s      
   |+++++++++++++++++++++++++                         | 49% ~01m 34s      
   |++++++++++++++++++++++++++                        | 51% ~01m 32s      
   |++++++++++++++++++++++++++                        | 52% ~01m 31s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 29s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 27s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 25s      
   |++++++++++++++++++++++++++++                      | 56% ~01m 23s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 21s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 19s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 17s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 16s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 14s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 12s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 11s      
   |++++++++++++++++++++++++++++++++                  | 64% ~01m 09s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 07s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 05s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 03s      
   |++++++++++++++++++++++++++++++++++                | 68% ~01m 01s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~59s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~57s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~55s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~53s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~51s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~50s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~48s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~46s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~44s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~42s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~40s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~38s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~36s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~34s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~32s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~30s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~29s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~27s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~25s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~23s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~19s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03m 07s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 32s      
   |++                                                | 2 % ~01m 31s      
   |++                                                | 3 % ~01m 30s      
   |+++                                               | 4 % ~01m 29s      
   |+++                                               | 5 % ~01m 28s      
   |++++                                              | 6 % ~01m 27s      
   |++++                                              | 8 % ~01m 33s      
   |+++++                                             | 9 % ~01m 31s      
   |+++++                                             | 10% ~01m 29s      
   |++++++                                            | 11% ~01m 28s      
   |++++++                                            | 12% ~01m 26s      
   |+++++++                                           | 13% ~01m 25s      
   |+++++++                                           | 14% ~01m 23s      
   |++++++++                                          | 15% ~01m 22s      
   |+++++++++                                         | 16% ~01m 20s      
   |+++++++++                                         | 17% ~01m 19s      
   |++++++++++                                        | 18% ~01m 18s      
   |++++++++++                                        | 19% ~01m 17s      
   |+++++++++++                                       | 20% ~01m 16s      
   |+++++++++++                                       | 22% ~01m 15s      
   |++++++++++++                                      | 23% ~01m 14s      
   |++++++++++++                                      | 24% ~01m 13s      
   |+++++++++++++                                     | 25% ~01m 12s      
   |+++++++++++++                                     | 26% ~01m 11s      
   |++++++++++++++                                    | 27% ~01m 10s      
   |++++++++++++++                                    | 28% ~01m 08s      
   |+++++++++++++++                                   | 29% ~01m 07s      
   |++++++++++++++++                                  | 30% ~01m 06s      
   |++++++++++++++++                                  | 31% ~01m 05s      
   |+++++++++++++++++                                 | 32% ~01m 04s      
   |+++++++++++++++++                                 | 33% ~01m 03s      
   |++++++++++++++++++                                | 34% ~01m 02s      
   |++++++++++++++++++                                | 35% ~01m 01s      
   |+++++++++++++++++++                               | 37% ~60s          
   |+++++++++++++++++++                               | 38% ~59s          
   |++++++++++++++++++++                              | 39% ~58s          
   |++++++++++++++++++++                              | 40% ~57s          
   |+++++++++++++++++++++                             | 41% ~56s          
   |+++++++++++++++++++++                             | 42% ~55s          
   |++++++++++++++++++++++                            | 43% ~53s          
   |+++++++++++++++++++++++                           | 44% ~53s          
   |+++++++++++++++++++++++                           | 45% ~52s          
   |++++++++++++++++++++++++                          | 46% ~51s          
   |++++++++++++++++++++++++                          | 47% ~50s          
   |+++++++++++++++++++++++++                         | 48% ~49s          
   |+++++++++++++++++++++++++                         | 49% ~49s          
NA

Display the top markers you computed above.

Assigning cell type identity to clusters

At a coarse level, we can use canonical markers to match the unbiased clustering to known cell types:

0: alpha 1: beta 2: beta 3: exocrine 4: duct 5: delta 6: gamma 7: endothelial 8: immune 9: stellate

# stash current cluster IDs
tiss <- StashIdent(object = tiss, save.name = "cluster.ids")
# enumerate current cluster IDs and the labels for them
cluster.ids <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
cell_ontology_class <-
  c(
  "monocyte",
  "granulocyte",
  NA,
  "granulocytopoietic cell",
  "hematopoietic precursor cell",
  "granulocyte",
  "late pro-B cell",
  "proerythroblast",
  "macrophage",
  "T cell",
  "erythroblast",
  NA,
  "early pro-B cell",
  "basophil"
  )
free_annotation = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
tiss = stash_annotations(tiss, cluster.ids, free_annotation, cell_ontology_class)
TSNEPlot(object = tiss, do.label = TRUE, pt.size = 0.5, group.by='cell_ontology_class')

Checking for batch effects

Color by metadata, like plate barcode, to check for batch effects.

TSNEPlot(object = tiss, do.return = TRUE, group.by = "channel")

TSNEPlot(object = tiss, do.return = TRUE, group.by = "mouse.sex")

Print a table showing the count of cells in each identity category from each plate.

table(as.character(tiss@ident), as.character(tiss@meta.data$channel))
    
     10X_P7_2 10X_P7_3
  0       252      273
  1       212      220
  10       66       89
  11       55       81
  12       38       27
  13       27       34
  2       183      202
  3       175      203
  4       156      174
  5       132      138
  6       152      113
  7        95      170
  8        99      124
  9        90       72

Save the Robject for later

When you save the annotated tissue, please give it a name.

filename = here('00_data_ingest', '04_tissue_robj_generated', 
          paste0("droplet", tissue_of_interest, "_seurat_tiss.Robj"))
print(filename)
[1] "/Users/olgabot/Documents/GitHub/tabula-muris/00_data_ingest/04_tissue_robj_generated/dropletMarrow_seurat_tiss.Robj"
save(tiss, file=filename)
# To reload a saved object
# filename = here('00_data_ingest', '04_tissue_robj_generated', 
#                      paste0("droplet", tissue_of_interest, "_seurat_tiss.Robj"))
# load(file=filename)

Export the final metadata

So that Biohub can easily combine all your cell_ontology_classs, please export them as a simple csv.

head(tiss@meta.data)
filename = here('00_data_ingest', '03_tissue_annotation_csv', 
                     paste0(tissue_of_interest, "_droplet_annotation.csv"))
write.csv(FetchData(tiss, c('channel','cell_ontology_class','cell_ontology_id', 'free_annotation', 'tSNE_1', 'tSNE_2')), file=filename)
LS0tCiB0aXRsZTogIk1hcnJvdyBEcm9wbGV0IE5vdGVib29rIgogb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKRW50ZXIgdGhlIGRpcmVjdG9yeSBvZiB0aGUgbWFjYSBmb2xkZXIgb24geW91ciBkcml2ZSBhbmQgdGhlIG5hbWUgb2YgdGhlIHRpc3N1ZSB5b3Ugd2FudCB0byBhbmFseXplLgoKYGBge3J9CnRpc3N1ZV9vZl9pbnRlcmVzdCA9ICJNYXJyb3ciCmxpYnJhcnkoaGVyZSkKc291cmNlKGhlcmUoIjAwX2RhdGFfaW5nZXN0IiwgIjAyX3Rpc3N1ZV9hbmFseXNpc19ybWQiLCAiYm9pbGVycGxhdGUuUiIpKQp0aXNzID0gbG9hZF90aXNzdWVfZHJvcGxldCh0aXNzdWVfb2ZfaW50ZXJlc3QpCmBgYAoKVmlzdWFsaXplIHRvcCBnZW5lcyBpbiBwcmluY2lwYWwgY29tcG9uZW50cwoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTh9ClBDSGVhdG1hcChvYmplY3QgPSB0aXNzLCBwYy51c2UgPSAxOjMsIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDgpCmBgYAoKTGF0ZXIgb24gKGluIEZpbmRDbHVzdGVycyBhbmQgVFNORSkgeW91IHdpbGwgcGljayBhIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Yga2VlcGluZyB0aGUgbWFqb3IgZGlyZWN0aW9ucyBvZiB2YXJpYXRpb24gaW4gdGhlIGRhdGEgYW5kLCBpZGVhbGx5LCBzdXByZXNzaW5nIG5vaXNlLiBUaGVyZSBpcyBubyBjb3JyZWN0IGFuc3dlciB0byB0aGUgbnVtYmVyIHRvIHVzZSwgYnV0IGEgZGVjZW50IHJ1bGUgb2YgdGh1bWIgaXMgdG8gZ28gdW50aWwgdGhlIHBsb3QgcGxhdGVhdXMuCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gdGlzcykKYGBgCgpDaG9vc2UgdGhlIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuCmBgYHtyfQojIFNldCBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMuIApuLnBjcyA9IDEwCmBgYAoKClRoZSBjbHVzdGVyaW5nIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBhIG5lYXJlc3QgbmVpZ2hib3JzIGdyYXBoLiBDZWxscyB0aGF0IGhhdmUgc2ltaWxhciBleHByZXNzaW9uIHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyLiBUaGUgTG91dmFpbiBhbGdvcml0aG0gbG9va3MgZm9yIGdyb3VwcyBvZiBjZWxscyB3aXRoIGhpZ2ggbW9kdWxhcml0eS0tbW9yZSBjb25uZWN0aW9ucyB3aXRoaW4gdGhlIGdyb3VwIHRoYW4gYmV0d2VlbiBncm91cHMuIFRoZSByZXNvbHV0aW9uIHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBzY2FsZS4uLmhpZ2hlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBtb3JlIGNsdXN0ZXJzLCBsb3dlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBmZXdlci4KCkZvciB0aGUgdG9wLWxldmVsIGNsdXN0ZXJpbmcsIGFpbSB0byB1bmRlci1jbHVzdGVyIGluc3RlYWQgb2Ygb3Zlci1jbHVzdGVyLiBJdCB3aWxsIGJlIGVhc3kgdG8gc3Vic2V0IGdyb3VwcyBhbmQgZnVydGhlciBhbmFseXplIHRoZW0gYmVsb3cuCgpgYGB7cn0KIyBTZXQgcmVzb2x1dGlvbiAKcmVzLnVzZWQgPC0gMC41Cgp0aXNzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSB0aXNzLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIAogICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUpCmBgYAoKClRvIHZpc3VhbGl6ZSAKYGBge3J9CiMgSWYgY2VsbHMgYXJlIHRvbyBzcHJlYWQgb3V0LCB5b3UgY2FuIHJhaXNlIHRoZSBwZXJwbGV4aXR5LiBJZiB5b3UgaGF2ZSBmZXcgY2VsbHMsIHRyeSBhIGxvd2VyIHBlcnBsZXhpdHkgKGJ1dCBuZXZlciBsZXNzIHRoYW4gMTApLgp0aXNzIDwtIFJ1blRTTkUob2JqZWN0ID0gdGlzcywgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDEwLCBwZXJwbGV4aXR5PTEwMCwgZGltLmVtYmVkID0gMikKYGBgCgpgYGB7cn0KIyBub3RlIHRoYXQgeW91IGNhbiBzZXQgZG8ubGFiZWw9VCB0byBoZWxwIGxhYmVsIGluZGl2aWR1YWwgY2x1c3RlcnMKVFNORVBsb3Qob2JqZWN0ID0gdGlzcywgZG8ubGFiZWwgPSBUKQpgYGAKCkNvbXBhcmUgdG8gcHJldmlvdXMgYW5ub3RhdGlvbnMKYGBge3J9CmZpbGVuYW1lID0gaGVyZSgnMDBfZGF0YV9pbmdlc3QnLCAnMDNfdGlzc3VlX2Fubm90YXRpb25fY3N2JywgCiAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCh0aXNzdWVfb2ZfaW50ZXJlc3QsICJfZHJvcGxldF9hbm5vdGF0aW9uLmNzdiIpKQpwcmV2aW91c19hbm5vdGF0aW9uID0gcmVhZF9jc3YoZmlsZW5hbWUpCnRpc3NAbWV0YS5kYXRhWywgJ3ByZXZpb3VzX2Fubm90YXRpb24nXSA8LSAiTkEiCnRpc3NAbWV0YS5kYXRhW2FzLmNoYXJhY3RlcihwcmV2aW91c19hbm5vdGF0aW9uJFgxKSwgJ3ByZXZpb3VzX2Fubm90YXRpb24nXSA8LSBhcy5jaGFyYWN0ZXIocHJldmlvdXNfYW5ub3RhdGlvbiRjZWxsX29udG9sb2d5X2NsYXNzKQpUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJwcmV2aW91c19hbm5vdGF0aW9uIikKYGBgCmBgYHtyfQp0YWJsZSh0aXNzQG1ldGEuZGF0YVssICJwcmV2aW91c19hbm5vdGF0aW9uIl0pCmBgYAoKCmBgYHtyfQp0YWJsZSh0aXNzQG1ldGEuZGF0YVssICJwcmV2aW91c19hbm5vdGF0aW9uIl0sIHRpc3NAaWRlbnQpCmBgYAoKQ2hlY2sgZXhwcmVzc2lvbiBvZiBnZW5lcyBvZiBpbnRlcnNldC4gRm91bmQgaW5jb25zaXN0ZW5zaWVzIGluIGdlbmUgbmFtZXMuIE1tZSAoQ2QxMCksIEx5Nmc2YywgTHk2ZzZlLCBhbmQgSWdhMmIgdGhvdWdoIHByZXNlbnQgaW4gcGxhdGUgZGF0YSB3YXMgbm90IGZvdW5kIGhlcmUgYW5kIGdhdmUgYW4gZXJyb3IuCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0xMjAsIGZpZy53aWR0aD0xNX0KZ2VuZXNfdG9fY2hlY2sgPSBjKCdJdGdhbScsICdJbDdyJywgJ0tpdCcsICdBdHhuMScsICdGbHQzJywgJ0NkMzQnLCAnU2xhbWYxJywgJ0dwcjU2JywgJ1N0bW4xJywgJ01raTY3JywgJ1RtZW0xNzZiJywgICdJdGdhbCcsICdJdGdheCcsICdFbXIxJywgJ0NkNjgnLCAnRmNncjMnLCAnQ2QxNCcsICdGY2dyNCcsICdNcGwnLCAnSWwzcmEnLCAnTXBlZzEnLCAnSXRnYjInLCAnQWhuYWsnLCAnUGxkNCcsICdDZDNlJywgJ0NkNCcsICdDZDhhJywgJ0NveDZhMicsICdDZDQwJywgJ1NwbicsICdMeTZkJywgJ0lyZjgnLCAnQ2QyNycsICdGY2VyMmEnLCAnQ2QyJywgJ0NkNycsICdUaHkxJywgJ0NkMTknLCAnTXM0YTEnLCAnQ3IyJywgJ0NkMjInLCAnQ2Q3NCcsICdDaGNoZDEwJywgJ0NucCcsICdDZDc5YScsICdDZDc5YicsICdWcHJlYjMnLCAnVnByZWIxJywgJ0RudHQnLCAnUGF4NScsICdSYWcxJywgJ1JhZzInLCAnQ3hjcjUnLCAnQ2NyNicsICdLbHJiMWEnLCAnUzEwMGExMScsICdMdGYnLCAnTmdwJywgJ0ZjZXIxZycsICdQZ2x5cnAxJywgJ0xjbjInLCAnQ2FtcCcsICdIcCcsICdQdHByYycsICdDZDQ4JywgJ1RmcmMnLCAnRW5nJywgJ0l0Z2EyJywgJ0N4Y3I0JywgJ0NkNDQnLCAnQnBnbScsICdCZXRhLXMnLCAnSGJiLWIyJywgJ0NwYTMnLCAnRmNlcjFhJywgJ01jcHQ4JywgJ0NjbDMnKQoKRmVhdHVyZVBsb3QodGlzcywgZ2VuZXNfdG9fY2hlY2ssIHB0LnNpemUgPSAxLCBuQ29sID0gMykKYGBgCgpEb3RwbG90cyBsZXQgeW91IHNlZSB0aGUgaW50ZW5zaXR5IG9mIGV4cHByZXNzaW9uIGFuZCB0aGUgZnJhY3Rpb24gb2YgY2VsbHMgZXhwcmVzc2luZyBmb3IgZWFjaCBvZiB5b3VyIGdlbmVzIG9mIGludGVyZXN0LgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTU3fQojIFRvIGNoYW5nZSB0aGUgeS1heGlzIHRvIHNob3cgcmF3IGNvdW50cywgYWRkIHVzZS5yYXcgPSBULgpEb3RQbG90KHRpc3MsIGdlbmVzX3RvX2NoZWNrLCBwbG90LmxlZ2VuZCA9IFQpCmBgYAoKSG93IGJpZyBhcmUgdGhlIGNsdXN0ZXJzPwpgYGB7cn0KdGFibGUodGlzc0BpZGVudCkKYGBgCgoKCldoaWNoIG1hcmtlcnMgaWRlbnRpZnkgYSBzcGVjaWZpYyBjbHVzdGVyPwoKYGBge3J9CmNsdXN0Lm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDIsIGlkZW50LjIgPSAxLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKYGBgCgoKYGBge3J9CnByaW50KHggPSBoZWFkKHg9IGNsdXN0Lm1hcmtlcnMsIG4gPSAxMCkpCmBgYAoKWW91IGNhbiBhbHNvIGNvbXB1dGUgYWxsIG1hcmtlcnMgZm9yIGFsbCBjbHVzdGVycyBhdCBvbmNlLiBUaGlzIG1heSB0YWtlIHNvbWUgdGltZS4KYGBge3J9CnRpc3MubWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhvYmplY3QgPSB0aXNzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkKYGBgCgpEaXNwbGF5IHRoZSB0b3AgbWFya2VycyB5b3UgY29tcHV0ZWQgYWJvdmUuCmBgYHtyfQp0aXNzLm1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3Bfbig1LCBhdmdfbG9nRkMpCmBgYAoKIyMgQXNzaWduaW5nIGNlbGwgdHlwZSBpZGVudGl0eSB0byBjbHVzdGVycwoKQXQgYSBjb2Fyc2UgbGV2ZWwsIHdlIGNhbiB1c2UgY2Fub25pY2FsIG1hcmtlcnMgdG8gbWF0Y2ggdGhlIHVuYmlhc2VkIGNsdXN0ZXJpbmcgdG8ga25vd24gY2VsbCB0eXBlczoKCjA6IGFscGhhCjE6IGJldGEKMjogYmV0YQozOiBleG9jcmluZQo0OiBkdWN0CjU6IGRlbHRhCjY6IGdhbW1hCjc6IGVuZG90aGVsaWFsCjg6IGltbXVuZQo5OiBzdGVsbGF0ZQoKYGBge3J9CiMgc3Rhc2ggY3VycmVudCBjbHVzdGVyIElEcwp0aXNzIDwtIFN0YXNoSWRlbnQob2JqZWN0ID0gdGlzcywgc2F2ZS5uYW1lID0gImNsdXN0ZXIuaWRzIikKCiMgZW51bWVyYXRlIGN1cnJlbnQgY2x1c3RlciBJRHMgYW5kIHRoZSBsYWJlbHMgZm9yIHRoZW0KY2x1c3Rlci5pZHMgPC0gYygwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMykKY2VsbF9vbnRvbG9neV9jbGFzcyA8LQogIGMoCiAgIm1vbm9jeXRlIiwKICAiZ3JhbnVsb2N5dGUiLAogIE5BLAogICJncmFudWxvY3l0b3BvaWV0aWMgY2VsbCIsCiAgImhlbWF0b3BvaWV0aWMgcHJlY3Vyc29yIGNlbGwiLAogICJncmFudWxvY3l0ZSIsCiAgImxhdGUgcHJvLUIgY2VsbCIsCiAgInByb2VyeXRocm9ibGFzdCIsCiAgIm1hY3JvcGhhZ2UiLAogICJUIGNlbGwiLAogICJlcnl0aHJvYmxhc3QiLAogIE5BLAogICJlYXJseSBwcm8tQiBjZWxsIiwKICAiYmFzb3BoaWwiCiAgKQoKZnJlZV9hbm5vdGF0aW9uID0gYyhOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpCgp0aXNzID0gc3Rhc2hfYW5ub3RhdGlvbnModGlzcywgY2x1c3Rlci5pZHMsIGZyZWVfYW5ub3RhdGlvbiwgY2VsbF9vbnRvbG9neV9jbGFzcykKClRTTkVQbG90KG9iamVjdCA9IHRpc3MsIGRvLmxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnk9J2NlbGxfb250b2xvZ3lfY2xhc3MnKQpgYGAKCgojIyBDaGVja2luZyBmb3IgYmF0Y2ggZWZmZWN0cwoKCkNvbG9yIGJ5IG1ldGFkYXRhLCBsaWtlIHBsYXRlIGJhcmNvZGUsIHRvIGNoZWNrIGZvciBiYXRjaCBlZmZlY3RzLgpgYGB7cn0KVFNORVBsb3Qob2JqZWN0ID0gdGlzcywgZG8ucmV0dXJuID0gVFJVRSwgZ3JvdXAuYnkgPSAiY2hhbm5lbCIpCmBgYAoKYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IHRpc3MsIGRvLnJldHVybiA9IFRSVUUsIGdyb3VwLmJ5ID0gIm1vdXNlLnNleCIpCmBgYAoKUHJpbnQgYSB0YWJsZSBzaG93aW5nIHRoZSBjb3VudCBvZiBjZWxscyBpbiBlYWNoIGlkZW50aXR5IGNhdGVnb3J5IGZyb20gZWFjaCBwbGF0ZS4KCmBgYHtyfQp0YWJsZShhcy5jaGFyYWN0ZXIodGlzc0BpZGVudCksIGFzLmNoYXJhY3Rlcih0aXNzQG1ldGEuZGF0YSRjaGFubmVsKSkKYGBgCgoKIyBTYXZlIHRoZSBSb2JqZWN0IGZvciBsYXRlcgpXaGVuIHlvdSBzYXZlIHRoZSBhbm5vdGF0ZWQgdGlzc3VlLCBwbGVhc2UgZ2l2ZSBpdCBhIG5hbWUuCgpgYGB7cn0KZmlsZW5hbWUgPSBoZXJlKCcwMF9kYXRhX2luZ2VzdCcsICcwNF90aXNzdWVfcm9ial9nZW5lcmF0ZWQnLCAKCQkgIHBhc3RlMCgiZHJvcGxldCIsIHRpc3N1ZV9vZl9pbnRlcmVzdCwgIl9zZXVyYXRfdGlzcy5Sb2JqIikpCnByaW50KGZpbGVuYW1lKQpzYXZlKHRpc3MsIGZpbGU9ZmlsZW5hbWUpCmBgYAoKYGBge3J9CiMgVG8gcmVsb2FkIGEgc2F2ZWQgb2JqZWN0CiMgZmlsZW5hbWUgPSBoZXJlKCcwMF9kYXRhX2luZ2VzdCcsICcwNF90aXNzdWVfcm9ial9nZW5lcmF0ZWQnLCAKIyAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoImRyb3BsZXQiLCB0aXNzdWVfb2ZfaW50ZXJlc3QsICJfc2V1cmF0X3Rpc3MuUm9iaiIpKQojIGxvYWQoZmlsZT1maWxlbmFtZSkKYGBgCgoKCiMgRXhwb3J0IHRoZSBmaW5hbCBtZXRhZGF0YQoKU28gdGhhdCBCaW9odWIgY2FuIGVhc2lseSBjb21iaW5lIGFsbCB5b3VyIGNlbGxfb250b2xvZ3lfY2xhc3NzLCBwbGVhc2UgZXhwb3J0IHRoZW0gYXMgYSBzaW1wbGUgY3N2LgoKYGBge3J9CmhlYWQodGlzc0BtZXRhLmRhdGEpCmBgYAoKCmBgYHtyfQpmaWxlbmFtZSA9IGhlcmUoJzAwX2RhdGFfaW5nZXN0JywgJzAzX3Rpc3N1ZV9hbm5vdGF0aW9uX2NzdicsIAogICAgICAgICAgICAgICAgICAgICBwYXN0ZTAodGlzc3VlX29mX2ludGVyZXN0LCAiX2Ryb3BsZXRfYW5ub3RhdGlvbi5jc3YiKSkKd3JpdGUuY3N2KEZldGNoRGF0YSh0aXNzLCBjKCdjaGFubmVsJywnY2VsbF9vbnRvbG9neV9jbGFzcycsJ2NlbGxfb250b2xvZ3lfaWQnLCAnZnJlZV9hbm5vdGF0aW9uJywgJ3RTTkVfMScsICd0U05FXzInKSksIGZpbGU9ZmlsZW5hbWUpCmBgYAo=